package cn.demoncat.util.lang;

import org.apache.commons.lang3.StringUtils;

import cn.demoncat.util.lang.constant.StringConstant;

/**
 * 名称工具
 * 
 * @author 延晓磊
 *
 * @since 2017年12月30日
 */
public final class NameUtil {

	/**
	 * 展示姓名时的模糊处理占位符
	 */
	private static final String NAME_DIM = "*";
	private static final String NAME_DIM2 = "**";
	/**
	 * 展示手机号时的模糊处理占位符
	 */
	private static final String MOBILE_DIM = "****";
	/**
	 * 展示邮箱时的模糊处理占位符
	 */
	private static final String EMAIL_DIM = "****";
	/**
	 * 展示QQ时的模糊处理占位符
	 */
	private static final String QQ_DIM = "****";
	/**
	 * 展示身份证号时的模糊处理占位符
	 */
	private static final String IDCARD_DIM = "****************";
	/**
	 * 展示银行卡号时的模糊处理占位符
	 */
	private static final String BANKCARD_DIM = "********";
	
	/**
	 * 将ReamName模糊处理
	 * 
	 * @param name
	 * 
	 * @return 如果name.length > 4，前2后2中间*
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月26日
	 */
	public static String nameDim(String name){
		if (StringUtils.isBlank(name)) {
			return StringConstant.EMPTY;
		}
		int i = name.length();
		if (i == 1) {
			return name;
		}else if (i == 2) {
			return name.charAt(0) + NAME_DIM;
		}else if (i == 3) {
			return name.charAt(0) + NAME_DIM + name.substring(2);
		}else if (i == 4) {
			return name.charAt(0) + NAME_DIM2 + name.substring(3);
		}else {
			return name.substring(0, 2) + stars(i-4) + name.substring(i - 2);
		}
	}

	/**
	 * 将Mobile模糊处理
	 * 
	 * @param mobile
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月26日
	 */
	public static String mobileDim(String mobile){
		if (StringUtils.isBlank(mobile)) {
			return StringConstant.EMPTY;
		}
		return mobile.substring(0, 3) + MOBILE_DIM + mobile.substring(mobile.length() - 4);
	}
	
	/**
	 * 将邮箱模糊处理
	 * 
	 * @param email
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月26日
	 */
	public static String emailDim(String email){
		if (StringUtils.isBlank(email)) {
			return StringConstant.EMPTY;
		}
		String[] parts = email.split(StringConstant.AT);
		return parts[0].charAt(0) + EMAIL_DIM + parts[0].substring(parts[0].length() - 1) + StringConstant.AT + parts[1];
	}
	 
	/**
	 * 将QQ模糊处理
	 * 
	 * @param qq
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月26日
	 */
	public static String qqDim(String qq){
		if (StringUtils.isBlank(qq)) {
			return StringConstant.EMPTY;
		}
		return qq.substring(0, 2) + QQ_DIM + qq.substring(qq.length() - 2);
	}
	
	/**
	 * 将身份证模糊处理
	 * 
	 * @param idCard
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月26日
	 */
	public static String idCardDim(String idCard){
		if (StringUtils.isBlank(idCard)) {
			return StringConstant.EMPTY;
		}
		return idCard.charAt(0) + IDCARD_DIM + idCard.substring(idCard.length() - 1);
	}
	
	/**
	 * 将银行卡模糊处理
	 * 
	 * @param bankCard
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月26日
	 */
	public static String bankCardDim(String bankCard){
		return bankCard.substring(0, 4) + BANKCARD_DIM + bankCard.substring(bankCard.length() - 3);
	}
	
	/**
	 * 将字符串模糊处理（全部转为*）
	 * 
	 * @param str
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月26日
	 */
	public static String dim(String str){
		return stars(str.length());
	}
	
	/**
	 * 将字符串模糊处理（全部转为*）
	 * 
	 * @param strs
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月26日
	 */
	public static String[] dim(String[] strs){
		String[] newArr = new String[strs.length];
		for (int i = 0; i < strs.length; i++) {
			// 不能修改原数组，否则引用传值
			newArr[i] = dim(strs[i]);
		}
		return newArr;
	}
	
	/**
	 * 将字符串模糊处理
	 * 
	 * @param str		字符串
	 * @param startNum	前缀字符数，最小0
	 * @param endNum	后缀字符数，最小0
	 * 
	 * @return	"startNum+endNum == 0"、"startNum+endNum >= str.length" 按name模糊处理，其它情况将中间部分模糊处理
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月19日
	 */
	public static String dim(String str, int startNum, int endNum){
		// 字符串为空
		if (StringUtils.isBlank(str)) {
			// 返回空
			return StringConstant.EMPTY;
		}
		// 最小0
		if (startNum < 0) {
			startNum = 0;
		}
		if (endNum < 0) {
			endNum = 0;
		}
		// "startNum+endNum == 0" 
		int maxLength = startNum + endNum;
		if (maxLength == 0) {
			// 按name处理
			return nameDim(str);
		}
		// "startNum+endNum >= str.length"
		int strLength = str.length();
		if (maxLength >= strLength) {
			// 按name处理
			return nameDim(str);
		}
		// 前缀字符0个
		if (startNum == 0) {
			// 模糊处理前部分
			return dim(str.substring(0, strLength - endNum)) + str.substring(strLength - endNum);
		}else {
			// 后缀字符0个
			if (endNum == 0) {
				// 模糊处理后部分
				return str.substring(0, startNum) + dim(str.substring(startNum));
			}else {
				// 前后缀都有字符串，模糊处理中间部分
				return str.substring(0, startNum) + dim(str.substring(startNum, strLength - endNum)) + str.substring(strLength - endNum);
			}
		}
	}

	/**
	 * 获取指定个*
	 * 
	 * @param num
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月19日
	 */
	public static String stars(int num) {
		StringBuilder sd = new StringBuilder();
		for (int i = 0; i < num; i++) {
			sd.append(StringConstant.STAR);
		}
		return sd.toString();
	}
	

}
